package com.ww.java8.fp.lambda;

/**
 * 输出
 * X::f()
 * X::f()
 *
 * @author wanggw
 * @date 2022-11-15 06:59:24
 */
public class UnboundMethodReference {
    public static void main(String[] args) {
        // 即使方法签名相同，也报错了，问题在于，这里其实还需要另一个隐藏参数参与：this，你不能在没有X对象的前提下调用f()
        // X::f表示未绑定的方法引用，因为它尚未绑定到对象
//        MakeString ms = X::f;
        // X::f赋给TransformX，在Java中是允许的
        // 使用未绑定的引用时，函数式方法的签名（接口中的单个方法）不再与方法引用的签名完全匹配，原因是：你需要一个对象来调用方法。
        TransformX sp = X::f;
        X x = new X();
        System.out.println(sp.transform(x));
        System.out.println(x.f());
    }
}

class X {
    String f() {
        return "X::f()";
    }
}

interface MakeString {
    String make();
}

interface TransformX {
    String transform(X x);
}
